//文件操作函数定义
#include "file.h"

// 打开文件
FILE *file_open(const char *path, const char *mode)
{
    FILE *fp = fopen(path, mode);
    if (fp == NULL)
    {
        printf("文件打开失败!\n");
        exit(-1);
    }
    return fp;
}


// 关闭文件并将*fp置为空 需要传入二级指针修改
/*
**fp=&fp 二级指针存放一级指针的地址
*/
int file_close(FILE **fp)
{
    fclose(*fp);
    *fp = NULL; //将一级指针fp指向空
}

// 统计文件中的行数,(以及每行有效字符个数)
int count_line_data(const char *path)
{
    // 打开文件
    FILE *fp = file_open(path, "r");
    int line_num = 0;  // 记录行数
    int line_data = 0; // 记录每一行数据
    char ch = 0;       // 读取文件中的每个字符
    while (EOF != (ch = fgetc(fp)))
    {

        if (ch == '\n')
        {
            line_num++;
            // printf("第%d行有%d个字符\n", line_num, line_data - 1);
            // line_data = 0; // 重新记录下一行数据
        }
        // if (ch != '\n') // 记录每行中的有效字符数
        // {               // ch != ' ' && ch != '\t' &&
        //     line_data++;
        // }
    }
    // printf("%s中一共有%d行数据\n", path, line_num);
    // 关闭文件
    file_close(&fp);

    //返回总行数
    return line_num;
}

// 将结构体中的数据写入到本地文件中
void save_users(sq_list *L, const char *file, const char *mode,int num)
{

    // printf("save_1=%p\n",L);
    //打印测试,写入前
    // Prt(L);

    // 安全判断
    IsFull_Sql_List(L);
    // 打开文件
    FILE *fp = file_open(file, mode);

    // 写入到本地文件
    for (int i = 0; i < num; i++)
    {
        //i+Line_Num的目的是让每次添加的数据都追加到文件末尾
        fprintf(fp, "%s\t\t|%s\t\t|%s\t\t|%d\t\t|%d\t\t|%d\n", L->data[i + Line_Num].name, L->data[i + Line_Num].password, L->data[i + Line_Num].sex, L->data[i + Line_Num].age, L->data[i + Line_Num].id, L->data[i + Line_Num].grade);
    }
    // 关闭文件
    file_close(&fp);
    // 打印测试,写入后
    // printf("save_2=%p\n", L);
    // Prt(L);
}

// 从文件中读取数据
sq_list *use_users(sq_list *L, const char *file)
{
    //统计文件总行数
    // int len=count_line_data(file);
    // 打开文件
    FILE *fp = file_open(file, "r");
    // 移动光标至第二行
    // fseek(fp, 69, SEEK_SET);
    //  从文件中读取数据
    for (int i = 0; i<Line_Num; i++)
    {
        fscanf(fp, "%s\t\t|%s\t\t|%s\t\t|%d\t\t|%d\t\t|%d\n", L->data[i].name, L->data[i].password, L->data[i].sex, &L->data[i].age, &L->data[i].id, &L->data[i].grade);
    }

    // 打印到终端,第一行不用打印(用于测试)
    // for (int i = 0; i < len-1; i++)
    // {
    //     fprintf(stdout, "%s\t\t|%s\t\t|%s\t\t|%d\t\t|%d\t\t|%d\n", L->data[i].name, L->data[i].password, L->data[i].sex, L->data[i].age, L->data[i].id, L->data[i].grade);
    // }

    // 关闭文件
    file_close(&fp);

    //返回顺序表指针
    return L;
}
